<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>[1.24]-缓存策略：更灵活地可配置化的多级缓存 | PhalApi(π框架) - PHP轻量级开源接口框架 - 助你创造价值！</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <meta content="yes" name="apple-mobile-web-app-capable">
    <meta content="black" name="apple-mobile-web-app-status-bar-style">
    <meta content="telephone=no" name="format-detection">
    <meta content="email=no" name="format-detection">
    <meta name="Author" content="PhalApi,ecitlm,dogstar">
    <meta name="description" content="[1.24]-缓存策略：更灵活地可配置化的多级缓存，PhalApi是一个PHP轻量级开源接口框架，致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议，可用于搭建接口/微服务/RESTful接口/Web Services。我们不断更新，保持生气；为接口负责，为开源负责！并承诺永久免费！">
    <meta name="keywords" content="PhalApi,phalapi,phalapi接口开发,后台接口开发,后台接口开发框架,接口开发,接口框架,开源接口框架,PHP后台接口开发,PHP接口开发,PHP接口框架,PHP后台接口框架,phalapi官网,PHP接口框架,php接口开发框架,php接口开发,php web框架,π框架,π开发框架,π接口框架,π接口开发框架,api接口,php接口,,PHP接口框架,phalapi文档,phalapi wiki,PhalApi文档,phalapi在线文档,phalapi官方文档">

    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" media="screen">
    <link rel="stylesheet" type="text/css" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" media="screen">
    <link rel="stylesheet" href="../css/main.css" />
    <link rel="stylesheet" href="../css/loading_bar.css" />
    <link rel="icon" href="http://webtools.qiniudn.com/dog_catch.png" type="image/x-icon" />
    <script src="../js/pace.min.js"></script>
	
	<!-- 代码高亮 -->
	<link rel="stylesheet" href="../css/highlight.min.css">
	<script src="../js/highlight.min.js"></script>
	<script>hljs.initHighlightingOnLoad();</script>
    
</head>

<body>
    <!-- navbar start -->
    <div class="navbar navbar-default navbar-fixed-top" id="mainnav" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand website_name" href="/"><!-- <span>PhalApi</span> --><strong></strong></a>
            </div>
            <div class="navbar-collapse collapse" aria-expanded="false" style="height: 1px;">
                <ul class="nav navbar-nav navbar-right" id="nav_bar">
                    <li><a href="https://www.phalapi.net/"><span class="glyphicon glyphicon-home"></span></a></li>
                    <li><a href="https://www.phalapi.net/download.html">下载</a></li>
                    <li class="active"><a href="https://www.phalapi.net/wikis/">文档</a></li>
                    <li><a href="https://www.phalapi.net/donate.html">贡献</a></li>
                    <li><a href="#">|</a></li>
                    <li><a href="http://qa.phalapi.net/" target="_blank">社区</a></li>
                    <li><a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a></li>
                    <li><a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a></li>
                    <li><a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a></li>
                </ul>
            </div>
            <!--/.nav-collapse -->
        </div>
    </div>
    <!-- navbar end -->


    <div id="content">
        <div class="container">
            <div class="row row-md-flex row-md-flex-wrap">
                <h4><a href="/wikis/%5B1.23%5D-%E8%AF%B7%E6%B1%82%E5%92%8C%E5%93%8D%E5%BA%94%EF%BC%9AGET%E5%92%8CPOST%E4%B8%A4%E8%80%85%E7%9A%86%E5%8F%AF%E5%BE%97%E5%8F%8A%E8%B6%85%E8%B6%8AJSON%E6%A0%BC%E5%BC%8F%E8%BF%94%E5%9B%9E.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.25%5D-%E5%9B%BD%E9%99%85%E5%8C%96%E7%BF%BB%E8%AF%91%EF%BC%9A%E4%B8%BA%E8%B5%B0%E5%90%91%E5%9B%BD%E9%99%85%E5%8C%96%E6%8F%90%E5%89%8D%E5%81%9A%E5%A5%BD%E7%BF%BB%E8%AF%91%E5%87%86%E5%A4%87.html">下一章</a></h4>
<hr />
<h2>1.24.1 论缓存的重要性</h2>
<p>在很多情况下，我们都需要缓存。如对重复获取但变化不大的数据进行缓存以提供服务器的响应能力，又如当需要为数据库服务器减少QPS时等等。但同时缓存也因为有延时导致数据不能实时更新，或者在需要更新时不能被更新。如在接口调试、单元测试或者预览时，但这些都可以通过一些技巧来获得。这里，将从简单的缓存、再到高速缓存、多级缓存逐步进行说明。</p>
<h2>1.24.2 简单缓存</h2>
<p>这里所指的简单缓存，是指文件缓存。因为实现简单，且部署方便。但其缺点也是明显的，如文件I/O读写导致性能低，不能支持分布式。所以在没有集群服务器下是适用的。</p>
<p>当需要使用文件缓存时，先对文件缓存进行DI注册，便可使用。</p>
<pre><code class="language-php">//$ vim ./Public/init.php 
DI()-&gt;cache = new PhalApi_Cache_File(array('path' =&gt; API_ROOT . '/Runtime', 'prefix' =&gt; 'demo'));

// 设置
DI()-&gt;cache-&gt;set('thisYear', 2015, 600);

// 获取
echo DI()-&gt;cache-&gt;get('thisYear');

// 删除
DI()-&gt;cache-&gt;delete('thisYear');</code></pre>
<h2>1.24.3 高速缓存</h2>
<p>高速缓存通常具备分布式的能力，并能进驻内存，因此性能高。但同样此优点所带来的则是需要另外部署缓存扩展，如常见的Memcached、Redis。若需要考虑缓存落地，还要进一点筛选和配置。  </p>
<p>如使用Memcached：</p>
<pre><code class="language-php">DI()-&gt;cache = new PhalApi_Cache_Memcached(array('host' =&gt; '127.0.0.1', 'port' =&gt; 11211, 'prefix' =&gt; 'demo_'));

// 设置
DI()-&gt;cache-&gt;set('thisYear', 2015, 600);

// 获取
echo DI()-&gt;cache-&gt;get('thisYear');

// 删除
DI()-&gt;cache-&gt;delete('thisYear');</code></pre>
<p>从上面示例代码注意到，我们使用了前缀配置，以防同一台MC服务器同一端口下key名冲突。当然，更好是使用配置文件来配置缓存的地址和端口，以及前缀。  </p>
<h3>如何配置多个Memcache/Memcached实例？</h3>
<p>实际项目开发中，当需要连接多个Memcache/Memcached实例，可以在单个实例配置基础上采用以下配置：  </p>
<pre><code class="language-php">$config = array(
    'host'    =&gt; '192.168.1.1, 192.168.1.2',  //多个用英文逗号分割
    'port'    =&gt; '11211, 11212',              //多个用英文逗号分割
    'weight'  =&gt; '20, 80',                    //（可选）多个用英文逗号分割
);

DI()-&gt;cache = new PhalApi_Cache_Memcached($config);</code></pre>
<p>上面配置了两个MC实例，分别是：</p>
<ul>
<li>192.168.1.1，端口为11211，权重为20</li>
<li>192.168.1.2，端口为11212，权重为80    </li>
</ul>
<p>其中，权重是可选的。并且<strong>以host域名的数量为基准</strong>，即最终MC实例数量以host的个数为准。端口数量不足时取默认值11211，多出的端口会被忽略；同样，权重数量不足时取默认值0，多出的权重会被忽略。  </p>
<p>如下，是一份稀疏配置：  </p>
<pre><code class="language-php">$config = array(
    'host'    =&gt; '192.168.1.1, 192.168.1.2, 192.168.1.3',
    'port'    =&gt; '11210',
);</code></pre>
<p>相当于：  </p>
<ul>
<li>192.168.1.1，端口为11210，权重为0（默认值）  </li>
<li>192.168.1.2，端口为11211（默认值），权重为0（默认值）  </li>
<li>192.168.1.3，端口为11211（默认值），权重为0（默认值）    </li>
</ul>
<p>请注意，通常不建议在权重weight使用稀疏配置，即要么全部不配置权重，要么全部配置权重，以免部分使用默认权重为0的MC实例不生效。  </p>
<blockquote>
<p>温馨提示：以上多个MC实例的配置，须更新到PhalApi 1.4.0及版本以上。  </p>
</blockquote>
<h2>1.24.4 多级缓存</h2>
<p>然而，很多时候，我们需要多级缓存来承载更大的访问量。以便结合本地低速缓存和分布式高速缓存来获得更好的用户体验和服务器吞吐率。这时，则可以使用多级缓存策略。  </p>
<p>在切换到多级缓存时，我们明显希望原有的代码调用不需要同步调整便能获得升级后的多级缓存，并且我们后台开发人员也希望可以轻便在原有的单点缓存的基础上进行扩展。所以这就引出了一个有趣的问题：我们该如何组织多级缓存？  </p>
<p>作为一个框架，除了考虑上述的原有调用、单点缓存复用外，还需要考虑到多级缓存的组装。部分框架，一如我最喜欢的Phalcon则是使用了配置的形式来实现。但仍然，我们需要了解其配置的各个格式要求才能更好掌握和使用，这点带来了学习的成本。因此，PhalApi则是使用了简单的组合模式来实现。  </p>
<p>正如你在源代码中看到的PhalApi_Cache_Multi类，通过此类的实例可以利用PhalApi_Cache_Multi::addCache()快速添加一个缓存节点，而节点的优先级则按开发同学添加的顺序来确定。显然在添加时，我们应该先添加分布式的高速缓存，再添加本地的低速缓存（希望不会有人先添加文件缓存再添加MC缓存）。而各个节点的初始化，则是我们之前所熟悉的。只是简单添加即可。</p>
<p>以下是结合文件缓存和MC缓存的多级缓存示例：</p>
<pre><code class="language-php">$cache = PhalApi_Cache_Multi();

$mcCache = new PhalApi_Cache_Memcached(array('host' =&gt; '127.0.0.1', 'port' =&gt; 11211, 'prefix' =&gt; 'demo_'));
$cache-&gt;addCache($mcCache);

$fileCache = new PhalApi_Cache_File(array('path' =&gt; API_ROOT . '/Runtime', 'prefix' =&gt; 'demo'));
$cache-&gt;addCache($fileCache);

DI()-&gt;cache = $cache;</code></pre>
<p>然后，就可像之前那样设置、获取和删除缓存，而不需考虑是单点缓存，还是多级缓存：</p>
<pre><code class="language-php">// 设置
DI()-&gt;cache-&gt;set('thisYear', 2015, 600);

// 获取
echo DI()-&gt;cache-&gt;get('thisYear');

// 删除
DI()-&gt;cache-&gt;delete('thisYear');</code></pre>
<h2>1.24.5 静态结构图</h2>
<p>对应地，我们可以得出清晰明了的UML静态结构图：</p>
<p><img src="http://webtools.qiniudn.com/20150411005257_51bddc79686ee2215d9b0f1144d903bf" alt="多级缓存静态结构图" /></p>
<p>结构层次非常简单，但主要分为三大类：左边是多级缓存；中间突出的是特殊情况，即：空对象模式下的空缓存；右边是目前已提供或者后期扩展的具体缓存实现。</p>
<hr />
<h4><a href="/wikis/%5B1.23%5D-%E8%AF%B7%E6%B1%82%E5%92%8C%E5%93%8D%E5%BA%94%EF%BC%9AGET%E5%92%8CPOST%E4%B8%A4%E8%80%85%E7%9A%86%E5%8F%AF%E5%BE%97%E5%8F%8A%E8%B6%85%E8%B6%8AJSON%E6%A0%BC%E5%BC%8F%E8%BF%94%E5%9B%9E.html">上一章</a>   <a href="/wikis/">文档首页</a>   <a href="/wikis/%5B1.25%5D-%E5%9B%BD%E9%99%85%E5%8C%96%E7%BF%BB%E8%AF%91%EF%BC%9A%E4%B8%BA%E8%B5%B0%E5%90%91%E5%9B%BD%E9%99%85%E5%8C%96%E6%8F%90%E5%89%8D%E5%81%9A%E5%A5%BD%E7%BF%BB%E8%AF%91%E5%87%86%E5%A4%87.html">下一章</a></h4><div style="float: left">
<h4>
<a href="http://qa.phalapi.net/">还有疑问？欢迎到社区提问！</a>
&nbsp;&nbsp;
<a href="http://docs.phalapi.net/#/v2.0/">切换到PhalApi 2.x 开发文档。</a>
</h4>
</div>
            </div>
        </div>
    </div>

 <!-- 广告位 -->
<div class="grid-wrapper desktop-only">
	<p align="center">
		<a href="http://7xiz2f.com1.z0.glb.clouddn.com/%E6%88%91%E7%9A%84%E5%90%8D%E5%AD%97%E5%8F%AB%EF%BC%9A%CF%80%E6%A1%86%E6%9E%B6%20-%20PhalApi%202016%E5%B9%B4%E5%BA%A6%E5%BC%80%E6%BA%90%E6%80%BB%E7%BB%93%20-%20%E5%AE%98%E6%96%B9%E5%87%BA%E5%93%81.pdf" target="blank"><img width="950" height="100" src="http://7xiz2f.com1.z0.glb.clouddn.com/ad_20170104.png"></a>
		<a href="http://www.itran.cc/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/9/69/b88bc92455dc1239f9a5bf8d72929.png"></a>
		<a href="http://web-tools.phalapi.net/" target="blank"><img width="950" height="100" src="http://7xslqv.com1.z0.glb.clouddn.com/images/7/d0/88f523566c482296aecc43d185ca2.png"></a>
	</p>
</div>

        <!-- footer -->
        <div class="footer">
            <div class="link container ">
                <div class=" col-xs-7 col-sm-7 col-md-7 col-lg-7 ">
                    <h3>PhalApi (π框架)</h3>
                    <p>一个轻量级PHP开源接口框架，专注于接口服务开发，支持HTTP/SOAP/RPC协议，拥有自动生成的在线文档、多种开发语言的客户端SDK包以及可重用的扩展类库，可用于快速搭建微服务、RESTful接口或Web
                        Services。</p>
                    <!-- <p>:</p> -->
                    <a href="https://www.phalapi.net/" target="_blank"> PhalApi </a>
                    <span>|</span>
                    <a href="http://qa.phalapi.net/" target="_blank">社区</a>
                    <span>|</span>
                    <a href="download.html" target="_blank">下载</a>
                    <span>|</span>
                    <a href="/wikis/">文档</a>
                    <span>|</span>
                    <a href="http://www.ituring.com.cn/book/2405" target="_blank">书籍</a>
                    <span>|</span>
                    <a href="http://demo.phalapi.net/listAllApis.php" target="_blank">体验</a>
                    <span>|</span>
                    <a href="donate.html" target="_blank">贡献</a>
                    <span>|</span>
                    <a href="https://github.com/phalapi/phalapi-library" target="_blank">扩展</a>
                    <span>|</span>
                    <a href="/license.html" target="_blank">许可</a>
                    <span>|</span>
                    <a href="/about.html" target="_blank">关于</a>
                    <span>|</span>
                    <a href="https://www.phalapi.net/wikis/en/" target="_blank">English</a>

                </div>
                <div class=" col-xs-5 col-sm-5 col-md-5 col-lg-5 contact_us ">
                    <h3>联系我们</h3>
                    <a href="https://github.com/phalapi/phalapi"><img src="../images/github.png" alt="github" /></a>
                    <a href="http://weibo.com/p/100808d236e99beb645bfb56ed1c37dde9b8bd?k=phalapi%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6&from=501&_from_=huati_topic"><img src="../images/weibo.png"  alt="weibo" /></a>
                    <a href="http://7xslqv.com1.z0.glb.clouddn.com/images/1/b0/894fde762850cb11250253f7d5ede.png"><img src="../images/zfb.png"  alt="zfb" /></a>
					<a target="_blank" href="//shang.qq.com/wpa/qunwpa?idkey=f16292029e59975d4ccfccc70ed87aa5c5646df512e83b0e9e1270e8368be461"><img border="0" src="images/qq.png" alt="π框架 - PhalApi交流群②" title="π框架 - PhalApi交流群②"></a>
					<a href="http://git.oschina.net/dogstar/PhalApi"><img src="../images/git-oschina.png"  alt="git-oschina" /></a>
                </div>
                <div class="cls"></div>
                <div class="text-center copy_right"> ©2015-2017 PhalApi All Rights Reserved. <a href="http://www.miitbeian.gov.cn" target="_blank">粤ICP备15028808号</a>

				<script type="text/javascript">var cnzz_protocol = (("https:" == document.location.protocol) ? " https://" : " http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1255326144'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s4.cnzz.com/z_stat.php%3Fid%3D1255326144%26show%3Dpic' type='text/javascript'%3E%3C/script%3E"));</script>
                </div>
            </div>
        </div>
    </div>


    <a href="https://github.com/phalapi"><img id="gitHub_fllow" style="position: fixed; top: 0; right: 0; border: 0;z-index:9999" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a>


    <script src="../js/jquery-1.11.1.min.js"></script>
    <script src="../js/bootstrap.min.js"></script>
</body>

</html>